<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    ul{
        padding: 0;
        margin: 0;
        list-style: none;
    }
    li{
        border: 1px solid deepskyblue;
        margin: 10px;
        max-width: 500px;
    }

</style>
<body>
    <div id="app">
        <fieldset>
            <legend>{{isLogin?'内容界面':'登入界面'}}</legend>
            
            <!-- 内容展示界面 -->
            <div class="content" v-if="isLogin">
                <h1>列表展示</h1>
                <button @click="isLogin=false">点击退出登入</button>
                <button @click="getList">点击获取列表数据</button>
                <h2>
                    <img :src="userInfo.headimgurl" width="50" alt="">
                    昵称：
                    <a href="">{{userInfo.nickname}}</a>
                </h2>
                <ul>
                    <li v-for="item in lists" :key="item._id">
                        <b>{{item.name}}</b>
                        <button v-has:read="permissionBtns">查看</button>
                        <button v-has:edit="permissionBtns">修改</button>
                        <button v-has:delete="permissionBtns">删除</button>
                        <button v-has:add="permissionBtns">添加</button>
                    </li>
                </ul>
            </div>
            <!-- 登入界面 -->
            <div class="login" v-else>
                <h1>请登入</h1>
                <label for="username">用户名:</label>
                <input type="text" id="username" v-model="username">
                <br>
                <label for="password">密码:</label>
                <input type="password" v-model="password" @keydown.enter="login">
                <br>
                <button @click="login">登入</button>
            </div>
        </fieldset>
    </div>
</body>
</html>
<script src='https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js'></script>
<script>

    //接口地址
    //登入接口:http://chst.vip/users/login
    //请求方式:post
    //参数:username password
    //admin admin || lbw 555
    //请求头:application/json

    // 需求:
    //1.页面加载的时候，展示登入界面，登入成功之后，展示内容界面
    //2.登入成功的页面切换，登入失败的提示
    //3.在登入成功页面，根据todos数据，展示列表
    //4.根据登入角色的权限，展示对应的按钮级权限

    //请求服务器的数据，需要携带token
    //token 令牌 携带令牌才能请求数据，这个令牌有生效时间
    //请求的时候，携带在请求头里面 authorization
    //令牌token可以存到sessionStorage中

    //封装一个登入请求的方法

    const loginApi = (params) =>{
        return fetch("http://chst.vip/users/login",{
            //请求方式
            method:'post',
            //请求头
            headers:{
                'content-type':'application/json'
            },
            //携带的参数(上载的参数)
            body:JSON.stringify(params)
        })
        .then(body=>body.json())
        .catch(err=>err.toString())
    }

    //获取列表的请求

    const getListApi=()=>{
        return fetch('http://chst.vip/students/getstulist?count=10',{
            headers:{
                'authorization':sessionStorage.getItem('user-token')
            }
        })
        .then(body=>body.json())
        .catch(err=>err.toString())
    }

    //声明全局的自定义指令，对按钮进行鉴权操作

    Vue.directive('has',{
        inserted(el,binding){
            console.log(binding)

            //按钮需要的权限edit,从指令参数获取
            let role = binding.arg;
            //用户权限 [read,add] 从表达式里面获取
            let userRole = binding.value;
            //判断用户没有吗按钮的权限
            let hasRole = userRole.includes(role)
            if(!hasRole){
                //1.禁用
                // el.disabled = true;
                //2.直接不显示，移除
                el.parentNode.removeChild(el)
            }

        }
    })

    let vm=new Vue({
        el:"#app",
        //登入
        methods:{
            async login(){
                //使用async和await来等待请求的异步结果
                let res = await loginApi({username:this.username,password:this.password})
                console.log(res)

                if(res.state){

                    //登入成功
                    this.isLogin = true;
                    //设置用户信息
                    this.userInfo=res.userInfo
                    //将用户的令牌存到本地
                    sessionStorage.setItem("user-token",res.token)
                    //给permissionBtns赋值
                    this.permissionBtns = res.permission.buttons;
                    //直接获取列表
                    this.getList()


                }else{
                    alert(res.msg)
                }
            },
            //获取列表
            async getList(){
                let res = await getListApi()
                //判断是否请求成功
                if(res.state){
                    //请求成功
                    this.lists = res.data
                }else{
                    alert(res.msg)
                }
            }
        },
        data:{
            //是否登入状态
            isLogin:false,
            username:"",
            password:"",
            //userInfo 用户信息
            userInfo:{},
            lists:[],
            //权限按钮
            permissionBtns:[]
        }
    })
</script>
